﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccessLayer;

namespace BusinessLogicLayer
{
    public class CongBLL
    {
        QuanLyChamCongDataContext DB = new QuanLyChamCongDataContext();
        public List<CONG> LayTatCa()
        {
            return DB.CONGs.ToList();
        }

        public CONG LayCong(int maNV, DateTime ngay)
        {
            return DB.CONGs.SingleOrDefault(a => a.MaNV == maNV && a.Ngay == ngay);
        }

        public void ThemCong(CONG c)
        {
            DB.CONGs.InsertOnSubmit(c);
            DB.SubmitChanges();
        }

        public int KiemTraTonTai(int maNV, DateTime ngay)
        {
            if (DB.CONGs.Any(a => a.MaNV == maNV && a.Ngay == ngay && a.GioDen != null))
            {
                return 1;
            }
            else if (DB.CONGs.Any(a => a.MaNV == maNV && a.Ngay == ngay && a.GioDen == null))
            {
                return 2;
            }
            else
                return 0;
        }

        public bool KiemTraGioVe(DateTime ngay, int manv)
        {
            if (DB.CONGs.Any(a => a.Ngay == ngay && a.MaNV == manv && a.GioVe == null))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public List<CONG> LayCongTheoThang(int _Thang, int _Nam, int _MaNV)
        {
            return DB.CONGs.Where(t => t.Ngay.Month == _Thang && t.Ngay.Year == _Nam && t.MaNV == _MaNV).ToList();
        }
        public Double LaySoCong(DateTime _ngay, int _manv)
        {

            var _socong = DB.CONGs.Where(a => a.Ngay == _ngay && a.MaNV == _manv).SingleOrDefault().SoCong;
            if (_socong == null)
                return 0;
            else
                return (Double)_socong;
        }

        public void SuaCong(CONG moi)
        {
            CONG cu = DB.CONGs.SingleOrDefault(a => a.MaNV == moi.MaNV && a.Ngay == moi.Ngay);
            if (cu != null)
            {
                if (moi.MaLoaiCong == null) { }
                else
                {
                    cu.MaLoaiCong = moi.MaLoaiCong;
                }
                //=================================================
                if (moi.SoCong == null) { }
                else
                {
                    cu.SoCong = moi.SoCong;
                }
                //=================================================
                if (moi.TrangThaiChot == null) { }
                else
                {
                    cu.TrangThaiChot = moi.TrangThaiChot;
                }
                //=================================================
                if (moi.GioDen == null) { }
                else
                {
                    cu.GioDen = moi.GioDen;
                }
                //=================================================

                if (moi.GioVe == null) { }
                else
                {
                    cu.GioVe = moi.GioVe;
                }
                //=================================================
                if (moi.LoaiChamCong == null) { }
                else
                {
                    cu.LoaiChamCong = moi.LoaiChamCong;
                }
                //=================================================
                if (moi.MACAddress == null) { }
                else
                {
                    cu.MACAddress = moi.MACAddress;
                }

                DB.SubmitChanges();
            }
            else
            {
                ThemCong(moi);
            }
        }

        public void SuaTTChot(CONG moi)
        {
            CONG cu = DB.CONGs.Single(a => a.MaNV == moi.MaNV && a.Ngay == moi.Ngay);
            cu.TrangThaiChot = moi.TrangThaiChot;
            DB.SubmitChanges();
        }

        public DateTime LayTGDen(int maNV, DateTime ngay)
        {
            CONG c = DB.CONGs.Single(a => a.MaNV == maNV && a.Ngay == ngay);
            return Convert.ToDateTime(c.GioDen);
        }

        public List<CONG2> LayMaCong(int thang, int nam, int manv)
        {
            string _thang;
            if (thang > 9)
            {
                //nếu tháng là 2 con số thì giữ nguyên
                _thang = nam.ToString() + "-" + thang.ToString();
            }
            else
            {
                //tháng chỉ có 1 số thì thêm số 0 phía trước
                _thang = nam.ToString() + "-0" + thang.ToString();
            }
            List<CONG2> ls = (from a in DB.CONGs
                              where a.MaNV == manv && a.Ngay.ToString().Contains(@_thang)
                              select new CONG2()
                              {
                                  Ngay = a.Ngay,
                                  MaCong = a.MaLoaiCong
                              }).ToList();
            return ls;
            
        }

        public void XoaCong(DateTime _ngay, int manv)
        {
            CONG a = DB.CONGs.SingleOrDefault(i => i.MaNV == manv && i.Ngay == _ngay);
            if (a == null)
            {
            }
            else
            {
                DB.CONGs.DeleteOnSubmit(a);
                DB.SubmitChanges();
            }
        }
        //public List

        public List<CONG> LayDSCongPhep(DateTime start, DateTime end)
        {
            List<CONG> ls = (from a in DB.CONGs
                             where a.Ngay >= start && a.Ngay <= end && a.GioDen == null
                             select a).ToList();
            return ls;
        }

        public void KiemTraTinhCong(int _manv)
        {
            //nhân viên
            List<CONG> _ls;
            if (_manv != 0)//tìm kiếm CONG chưa hoàn chỉnh (nhân viên)
            {
                _ls = (from a in DB.CONGs
                       where a.MaNV == _manv && a.LoaiChamCong == 1 && a.TrangThaiChot == 0
                       select a).ToList();
            }
            else//tìm kiếm CONG chưa hoàn chỉnh (lãnh đạo)
            {
                _ls = (from a in DB.CONGs
                       where a.LoaiChamCong == 1 && a.TrangThaiChot == 0
                       select a).ToList();
            }

            //Tính Công và Mã Công
            if (_ls.Count > 0)
            {
                TangCaBLL tcBLL = new TangCaBLL();
                LoaiCongBLL lcBLL = new LoaiCongBLL();
                foreach (var i in _ls)
                {
                    if (i.GioDen != null && i.GioVe != null)//loai cham cong thieu
                    {
                        TinhThoiGian tg = new TinhThoiGian();

                        var _thoigian = tg.TinhTG((DateTime)i.GioDen, (DateTime)i.GioVe, i.MaNV);
                        double giolam = _thoigian._GioLam;
                        double giotangca = _thoigian._GioTangCa;
                        double hesotc = _thoigian._HeSoTC;

                        double _congphep = LaySoCong(i.Ngay, i.MaNV);

                        if (giolam > 0)
                        {
                            CONG _cong = new CONG();
                            _cong.MaNV = i.MaNV;
                            _cong.Ngay = i.Ngay;
                            double _socong = TinhCong(giolam);
                            //Công làm việc bằng công làm việc cộng với công xin phép (nếu có)
                            _cong.SoCong = _socong + _congphep;
                            _cong.MaLoaiCong = lcBLL.LayMaLoaiCong((double)_cong.SoCong).ToString();

                            _cong.TrangThaiChot = 0;
                            _cong.LoaiChamCong = 0;
                            //Sửa vào bảng công
                            SuaCong(_cong);
                        }

                        //Thêm vào bảng Tăng Ca
                        if (LamTron(giotangca, 1) >= 1)
                        {
                            TANGCA tc = new TANGCA();
                            tc.Ngay = i.Ngay;
                            tc.MaNV = i.MaNV;
                            tc.TrangThaiChot = 0;
                            tc.ThoiGian = LamTron(giotangca, 1);
                            tc.HeSo = hesotc;
                            tcBLL.Them(tc);
                        }
                    }
                }
            }

        }

        protected double LamTron(double value, int fractionDigits)
        {
            double d = Math.Pow(10, fractionDigits);

            return (Math.Round(value * d) / d);
        }

        protected double TinhCong(double tgLamViec)
        {
            ThamSoBLL tsBLL = new ThamSoBLL();
            int tgCong = (int.Parse(tsBLL.LayGiaTri("TGCong")));
            if (tgLamViec >= tgCong)
                return 1;
            if (tgLamViec >= (tgCong * 0.75))
                return 0.75;
            if (tgLamViec >= (tgCong * 0.5))
                return 0.5;
            if (tgLamViec >= (tgCong * 0.25))
                return 0.25;
            else
                return 0;
        }
    }
}
